React Error Boundaries மற்றும் ஹூக்குகளைப் பயன்படுத்தி ரிசோர்ஸ் லோடிங் பிழைகளைச் சீராகக் கையாண்டு, பயனர் அனுபவம் மற்றும் செயலியின் நிலைத்தன்மையை மேம்படுத்துங்கள்.
React-ல் வலுவான ரிசோர்ஸ் லோடிங்: ஹூக்குகளுடன் Error Boundaries-ஐ கையாளுதல்
நவீன வலைச் செயலிகளில், ரிசோர்ஸ்களை ஒத்திசைவற்ற முறையில் லோட் செய்வது ஒரு பொதுவான நடைமுறையாகும். அது ஒரு API-இலிருந்து தரவைப் பெறுவதாக இருந்தாலும், படங்களை லோட் செய்வதாக இருந்தாலும், அல்லது மாட்யூல்களை இறக்குமதி செய்வதாக இருந்தாலும், ரிசோர்ஸ் லோடிங்கின் போது ஏற்படக்கூடிய பிழைகளைக் கையாள்வது ஒரு சீரான பயனர் அனுபவத்திற்கு மிகவும் முக்கியமானது. React Error Boundaries, அவற்றின் கீழ் உள்ள காம்போனென்ட் ட்ரீயில் எங்கிருந்தும் ஜாவாஸ்கிரிப்ட் பிழைகளைப் பிடிக்கவும், அந்தப் பிழைகளைப் பதிவு செய்யவும், முழு செயலியையும் செயலிழக்கச் செய்வதற்குப் பதிலாக ஒரு ஃபால்பேக் UI-ஐக் காட்டவும் ஒரு வழிமுறையை வழங்குகிறது. இந்தக் கட்டுரை, React Hooks-களுடன் இணைந்து Error Boundaries-ஐப் பயன்படுத்தி ரிசோர்ஸ் லோடிங் பிழைகளை எவ்வாறு திறம்பட நிர்வகிப்பது என்பதை ஆராய்கிறது.
Error Boundaries-ஐப் புரிந்துகொள்ளுதல்
React 16-க்கு முன்பு, காம்போனென்ட் ரெண்டரிங்கின் போது கையாளப்படாத ஜாவாஸ்கிரிப்ட் பிழைகள் React-ன் உள் நிலையைச் சிதைத்து, அடுத்தடுத்த ரெண்டர்களில் குழப்பமான பிழைகளை ஏற்படுத்தும். Error Boundaries, அவற்றின் கீழ் உள்ள காம்போனென்ட்களில் ஏற்படும் பிழைகளுக்கான கேட்ச்-ஆல் பிளாக்குகளாகச் செயல்படுவதன் மூலம் இந்தப் பிரச்சனைக்குத் தீர்வு காண்கின்றன. அவை பின்வரும் லைஃப்சைக்கிள் மெத்தடுகளில் ஒன்று அல்லது இரண்டையும் செயல்படுத்தும் React காம்போனென்ட்கள் ஆகும்:
static getDerivedStateFromError(error): இந்த ஸ்டேடிக் மெத்தட், ஒரு கீழ்நிலை காம்போனென்டால் பிழை ஏற்பட்ட பிறகு அழைக்கப்படுகிறது. இது ஏற்பட்ட பிழையை ஒரு ஆர்குமென்டாகப் பெற்று, காம்போனென்டின் ஸ்டேட்டைப் புதுப்பிக்க ஒரு மதிப்பைத் திருப்பியளிக்கிறது.componentDidCatch(error, info): இந்த லைஃப்சைக்கிள் மெத்தட், ஒரு கீழ்நிலை காம்போனென்டால் பிழை ஏற்பட்ட பிறகு அழைக்கப்படுகிறது. இது ஏற்பட்ட பிழையை ஒரு ஆர்குமென்டாகவும், எந்த காம்போனென்ட் பிழையை ஏற்படுத்தியது என்பது பற்றிய தகவல்களைக் கொண்ட ஒரு ஆப்ஜெக்ட்டையும் பெறுகிறது. இதை நீங்கள் பிழைத் தகவல்களைப் பதிவு செய்யப் பயன்படுத்தலாம்.
முக்கியமாக, Error Boundaries ஆனது ரெண்டரிங் கட்டத்தில், லைஃப்சைக்கிள் மெத்தடுகளில், மற்றும் அவற்றின் கீழ் உள்ள முழு ட்ரீயின் கன்ஸ்ட்ரக்டர்களில் ஏற்படும் பிழைகளை மட்டுமே பிடிக்கும். அவை not பின்வருவனவற்றிற்கான பிழைகளைப் பிடிக்காது:
- ஈவென்ட் ஹேண்ட்லர்கள் (கீழேயுள்ள பிரிவில் மேலும் அறிக)
- ஒத்திசைவற்ற குறியீடு (எ.கா.,
setTimeoutஅல்லதுrequestAnimationFrameகால்பேக்குகள்) - சர்வர்-சைட் ரெண்டரிங்
- Error Boundary-லேயே ஏற்படும் பிழைகள் (அதன் கீழ் உள்ள காம்போனென்ட்களில் அல்ல)
Error Boundaries மற்றும் React Hooks: ஒரு சக்திவாய்ந்த கலவை
Error Boundaries-ஐ செயல்படுத்த கிளாஸ் காம்போனென்ட்கள் பாரம்பரியமாகப் பயன்படுத்தப்பட்டாலும், React Hooks மிகவும் சுருக்கமான மற்றும் செயல்பாட்டு அணுகுமுறையை வழங்குகின்றன. பிழை கையாளுதல் தர்க்கத்தை உள்ளடக்கிய மற்றும் ரிசோர்ஸ் லோடிங்கின் போது பிழைகளை ஏற்படுத்தக்கூடிய காம்போனென்ட்களை எளிதாகச் சுற்றிவைக்க ஒரு வசதியான வழியை வழங்கும், மீண்டும் பயன்படுத்தக்கூடிய useErrorBoundary ஹூக்கை நாம் உருவாக்கலாம்.
தனிப்பயன் useErrorBoundary ஹூக்கை உருவாக்குதல்
useErrorBoundary ஹூக்கின் ஒரு எடுத்துக்காட்டு இங்கே:
import { useState, useCallback } from 'react';
function useErrorBoundary() {
const [error, setError] = useState(null);
const resetError = useCallback(() => {
setError(null);
}, []);
const captureError = useCallback((e) => {
setError(e);
}, []);
const ErrorBoundary = useCallback(({ children, fallback }) => {
if (error) {
return fallback ? fallback : An error occurred: {error.message || String(error)};
}
return children;
}, [error]);
return { ErrorBoundary, captureError, error, resetError };
}
export default useErrorBoundary;
விளக்கம்:
useState: பிழை நிலையை (error state) நிர்வகிக்கuseState-ஐப் பயன்படுத்துகிறோம். இது ஆரம்பத்தில் பிழையைnullஎன அமைக்கிறது.useCallback:resetErrorமற்றும்captureErrorசெயல்பாடுகளை மெமோயிஸ் செய்யuseCallback-ஐப் பயன்படுத்துகிறோம். இந்தச் செயல்பாடுகள் ப்ராப்ஸாக அனுப்பப்பட்டால் தேவையற்ற மறு-ரெண்டர்களைத் தடுப்பது ஒரு நல்ல நடைமுறையாகும்.ErrorBoundaryகாம்போனென்ட்: இதுuseCallback-ஐக் கொண்டு உருவாக்கப்பட்ட ஒரு ஃபங்ஷனல் காம்போனென்ட் ஆகும். இதுchildrenமற்றும் விருப்பத்தேர்வானfallbackப்ராப்பை எடுத்துக்கொள்கிறது. ஸ்டேட்டில் ஒரு பிழை இருந்தால், அது வழங்கப்பட்டfallbackகாம்போனென்டையோ அல்லது ஒரு இயல்புநிலை பிழை செய்தியையோ ரெண்டர் செய்கிறது. இல்லையெனில், அது சில்ட்ரனை ரெண்டர் செய்கிறது. இது நமது Error Boundary ஆகச் செயல்படுகிறது. டிபென்டென்சி அரேவான `[error]`, `error` ஸ்டேட் மாறும் போது இது மறு-ரெண்டர் செய்வதை உறுதி செய்கிறது.captureErrorசெயல்பாடு: இந்தச் செயல்பாடு பிழை நிலையை அமைக்கப் பயன்படுகிறது. ரிசோர்ஸ்களை லோட் செய்யும்போது இதை ஒருtry...catchபிளாக்கிற்குள் அழைப்பீர்கள்.resetErrorசெயல்பாடு: இந்தச் செயல்பாடு பிழை நிலையை நீக்குகிறது, இதனால் காம்போனென்ட் அதன் சில்ட்ரனை மீண்டும் ரெண்டர் செய்ய அனுமதிக்கிறது (சாத்தியமானால் ரிசோர்ஸ் லோடிங்கை மீண்டும் முயற்சிக்கிறது).
பிழை கையாளுதலுடன் ரிசோர்ஸ் லோடிங்கை செயல்படுத்துதல்
இப்போது, இந்த ஹூக்கை ரிசோர்ஸ் லோடிங் பிழைகளைக் கையாள எப்படிப் பயன்படுத்துவது என்று பார்ப்போம். ஒரு API-இலிருந்து பயனர் தரவைப் பெறும் ஒரு காம்போனென்ட்டைக் கருத்தில் கொள்வோம்:
import React, { useState, useEffect } from 'react';
import useErrorBoundary from './useErrorBoundary';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const { ErrorBoundary, captureError, error, resetError } = useErrorBoundary();
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (e) {
captureError(e);
}
};
fetchData();
}, [userId, captureError]);
if (error) {
return (
Failed to load user data. {user.name}
Email: {user.email}
{/* Other user details */}விளக்கம்:
- நாம்
useErrorBoundaryஹூக்கை இறக்குமதி செய்கிறோம். ErrorBoundaryகாம்போனென்ட்,captureErrorசெயல்பாடு,errorஸ்டேட் மற்றும்resetErrorசெயல்பாட்டைப் பெற நாம் ஹூக்கை அழைக்கிறோம்.useEffectஹூக்கிற்குள், API அழைப்பை ஒருtry...catchபிளாக்கில் வைக்கிறோம்.- API அழைப்பின் போது ஒரு பிழை ஏற்பட்டால், பிழை நிலையை அமைக்க
captureError(e)-ஐ அழைக்கிறோம். errorஸ்டேட் அமைக்கப்பட்டிருந்தால், நாம்ErrorBoundaryகாம்போனென்டை ரெண்டர் செய்கிறோம். ஒரு பிழை செய்தியையும் "Retry" பொத்தானையும் காட்டும் தனிப்பயன்fallbackப்ராப்பை நாம் வழங்குகிறோம். பொத்தானைக் கிளிக் செய்வதுresetError-ஐ அழைத்து பிழை நிலையை நீக்கி, ஒரு மறு-ரெண்டரைத் தூண்டி, தரவைப் பெற மற்றொரு முயற்சியை மேற்கொள்ளும்.- பிழை ஏதும் ஏற்படவில்லை மற்றும் பயனர் தரவு ஏற்றப்பட்டிருந்தால், பயனர் சுயவிவர விவரங்களை ரெண்டர் செய்கிறோம்.
பல்வேறு வகையான ரிசோர்ஸ் லோடிங் பிழைகளைக் கையாளுதல்
பல்வேறு வகையான ரிசோர்ஸ் லோடிங் பிழைகளுக்கு வெவ்வேறு கையாளுதல் உத்திகள் தேவைப்படலாம். சில பொதுவான சூழ்நிலைகள் மற்றும் அவற்றை எவ்வாறு கையாள்வது என்பது இங்கே:
நெட்வொர்க் பிழைகள்
கிளையன்ட் சர்வருடன் இணைக்க முடியாதபோது நெட்வொர்க் பிழைகள் ஏற்படுகின்றன (எ.கா., நெட்வொர்க் செயலிழப்பு அல்லது சர்வர் செயலிழப்பு). மேலே உள்ள உதாரணம் ஏற்கனவே `response.ok`-ஐப் பயன்படுத்தி அடிப்படை நெட்வொர்க் பிழைகளைக் கையாள்கிறது. நீங்கள் இன்னும் நுட்பமான பிழை கண்டறிதலைச் சேர்க்க விரும்பலாம், உதாரணமாக:
//Inside the fetchData function
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
// Consider adding specific error code handling
if (response.status === 404) {
throw new Error("User not found");
} else if (response.status >= 500) {
throw new Error("Server error. Please try again later.");
} else {
throw new Error(`HTTP error! status: ${response.status}`);
}
}
const data = await response.json();
setUser(data);
} catch (error) {
if (error.message === 'Failed to fetch') {
// Likely a network error
captureError(new Error('Network error. Please check your internet connection.'));
} else {
captureError(error);
}
}
இந்த நிலையில், நெட்வொர்க் இணைப்புச் சிக்கல் உள்ளது என்பதைக் குறிக்கும் ஒரு செய்தியைப் பயனருக்குக் காட்டி, அவர்களின் இணைய இணைப்பைச் சரிபார்க்கப் பரிந்துரைக்கலாம்.
API பிழைகள்
சர்வர் ஒரு பிழை பதிலை அனுப்பும்போது API பிழைகள் ஏற்படுகின்றன (எ.கா., ஒரு 400 Bad Request அல்லது ஒரு 500 Internal Server Error). மேலே காட்டப்பட்டுள்ளபடி, நீங்கள் `response.status`-ஐச் சரிபார்த்து இந்தப் பிழைகளை முறையாகக் கையாளலாம்.
தரவு பாகுபடுத்தல் பிழைகள்
சர்வரிலிருந்து வரும் பதில் எதிர்பார்த்த வடிவத்தில் இல்லாதபோதும், அதைப் பாகுபடுத்த முடியாதபோதும் தரவு பாகுபடுத்தல் பிழைகள் ஏற்படுகின்றன (எ.கா., தவறான JSON). response.json() அழைப்பை ஒரு try...catch பிளாக்கில் வைப்பதன் மூலம் இந்தப் பிழைகளைக் கையாளலாம்:
//Inside the fetchData function
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (error) {
if (error instanceof SyntaxError) {
captureError(new Error('Failed to parse data from server.'));
} else {
captureError(error);
}
}
படங்களை ஏற்றுவதில் ஏற்படும் பிழைகள்
படங்களை ஏற்றுவதற்கு, <img> டேக்கில் உள்ள onError ஈவென்ட் ஹேண்ட்லரைப் பயன்படுத்தலாம்:
function MyImage({ src, alt }) {
const { ErrorBoundary, captureError } = useErrorBoundary();
const [imageLoaded, setImageLoaded] = useState(false);
const handleImageLoad = () => {
setImageLoaded(true);
};
const handleImageError = (e) => {
captureError(new Error(`Failed to load image: ${src}`));
};
return (
Failed to load image.